package com.active.test.queue.consumer;

import lombok.extern.slf4j.Slf4j;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 *
 * @author lzy
 * @create 2019-08-26 下午5:52
 */
@Slf4j
public class JmsConsumer {
    private static final String ACTIVEMQ_URL = "tcp://localhost:61616";
    private static final String QUEUE_NAME = "queue01";

    public static void main(String[] args) throws JMSException, IOException {
        //1.创建连接工厂，按照给定的url地址，采用默认用户名和密码
        final ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        //2.通过连接工厂，获取连接的connection
        final Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();

        //3.创建会话
        // 两个参数，第一个叫事务，第二个叫签收
        final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //4.创建目的地（具体是队列还是主题）
        final Queue destination = session.createQueue(QUEUE_NAME);

        //5.创建消费者
        final MessageConsumer consumer = session.createConsumer(destination);

        /*
         * 同步阻塞方式（receive()）
         * 订阅者或者接收者调用MessageConsumer的receive()方法来接收消息，receive方法
         * 在能够接收到消息之前（或者超时之前）将一直阻塞
         */
        /*while (true) {
            //从队列接收消息
            final TextMessage message = (TextMessage) consumer.receive(4000L);
            if (message != null) {
                System.out.println("消费者接收到消息：" + message.getText());
            } else {
                break;
            }
        }

        consumer.close();
        session.close();
        connection.close();*/

        /**
         * 通过监听的方式来消费消息
         */
        consumer.setMessageListener(message -> {
            if (null != message && message instanceof TextMessage) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    log.info("消费者message listener接收到消息：{}", textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });

        // press any key to exit
        System.in.read();

        consumer.close();
        session.close();
        connection.close();

        /*
         * 1.先生产，只启动1号消费者。问题：1号消费者能消费消息么？ 可以
         * 2.先生产， 先启动1号消费者，再启动2号消费者，问题：2号消费者还能消费消息吗？
         *  2.1 1号可以消费
         *  2.2 2号可以消费么？否
         * 先后启动的情况下，先启动的消费者会获取全部的消息队列里的消息，而后启动的消费者获取不到消息
         * 3.先启动2个消费者，再生产6条消息，请问：消费情况如何？
         *  3.1 2个消费者都有6条 n
         *  3.2 先到先得，6条全部给一个 n
         *  3.3 一人一半  y
         * 当有多个消费者同时监听的时候，默认情况下，mq会将消息队列里面的消息平均分配给消费者
         *
         * ４.MQ挂了，那么消息的持久化和丢失情况分别如何？
         */
    }
}
